/*
 * Arbol.h
 *
 *  Created on: 03/04/2010
 *      Author: administrador
 */

#ifndef ARBOL_H_
#define ARBOL_H_

#include "INodo.h"
#include "NodoHoja.h"
#include "NodoIndice.h"
#include "Elemento.h"

class Arbol:public Serializable {

private:

	static Arbol* instancia;
	static int idRaiz;
	Arbol(int tamanioMaximo);

	INodo* raiz;
	NodoHoja* nodoActual;
	Elemento* elementoActual;
	int cantidadNiveles;

	void solucionarOverflow();

	void solucionarUnderflow();

public:

	static int const EDERECHO = NodoHoja::EDERECHO;

	static int const EIZQUIERDO = NodoHoja::EIZQUIERDO;

	static int tamanioMaximoNodo;

	static const float porcentajeCargaMaxima;

	static const float porcentajeOverflow ;

	static const float porcentajeUnderflow ;

	static Arbol* getInstancia();

	static void borrarInstancia();

	static int getIdRaiz();

	static void setTamanioMaximoNodo(int tamanio);

	virtual ~Arbol();

	void print();

	void insertarElemento(Elemento* elemento);

	void quitarElemento(Clave clave);

	void modificarElemento(Clave clave, string* nuevoValor);

	/* Retorna el elemento con clave pasada por parametro.
	 * Si no lo encuentra, retorna el que tenga clave inmediatamente siguiente.
	 * Si la clave supera la clave del elemento mas grande, retorna la excepcion Elemento Inexistente. */
	Elemento* buscarElemento(Clave clave);

	/* Retorna el elemento con clave mas chica del arbol.
	 * Si esta vacio, retorna la excepcion Nodo Vacio */
//	Elemento* primerElemento();

	/* Retorna el elemento actual apuntado por el arbol */
	Elemento* getElementoActual();

	void setElementoActual(Elemento* elemento);

	static void setNombreArchivo(char *nombre);

	void setNodoActual(NodoHoja* nodo);

	/* Retorna el elemento siguiente al elemento actual */
	Elemento* getElementoContiguo(int desplazamiento);

	void hidratar();

	void serializar();

};

#endif /* ARBOL_H_ */
